package com.study.reflect.example.ex01;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Properties;

import org.junit.Test;

/**
* @Name: ReflectTest
* @Description: 读取配置文件中的类路径，通过反射调用类中的方法
* 说明：
* 	配置文件内容格式：类名=类的包路径
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-17 下午7:29:50 
* @Version: V1.0
 */
public class ReflectTest {
	
	/**
	* @Name: invokeMethod
	* @Description: 根据类的包路径，及无参方法名称，调用类中指定的无参方法
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-17 下午7:37:52
	* @Parameters: @param classPackagePath 类的包路径
	* @Parameters: @param methodName 类方法名称
	* @Return: void 无
	 */
	public void invokeMethod(String classPackagePath, String methodName) throws Exception {
		//创建字节码文件对象
		Class clazz = Class.forName(classPackagePath) ;
		//获取无参构造方法对象
		Constructor con = clazz.getDeclaredConstructor() ;
		//取消访问权限检查
		con.setAccessible(true) ;
		//创建对象实例
		Object obj = con.newInstance() ;
		//获取对象成员方法对象
		Method method = clazz.getDeclaredMethod(methodName) ;
		//取消权限访问检查
		method.setAccessible(true) ;
		//执行该方法
		method.invoke(obj) ;
	}
	
	/**
	* @Name: getClassPackagePath
	* @Description: 根据指定的类名称，读取配置文件，获取类的类的包路径
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-17 下午7:44:53
	* @Parameters: @param className 类名称
	* @Return: String 返回类的包路径
	 */
	public String getClassPackagePath(String className) throws IOException {
		//创建文件字符读取流
		Reader reader = new FileReader("class.txt") ;
		//创建属性集合对象
		Properties prop = new Properties() ;
		//读取配置文件中的数据，加载到属性集合中
		prop.load(reader) ;
		//遍历属性集合，获取指定类名称的包路径
		for(Map.Entry entry : prop.entrySet()) {
			if(className.equals(entry.getKey())) {
				return (String) entry.getValue() ;
			}
		}
		//如果不存在指定的类名称，返回null
		return null ;
	}
	
	@Test
	public void test() throws Exception {
		String classPackagePath = getClassPackagePath("Worker") ;
		String methodName = "love" ;
		if(classPackagePath != null) {
			invokeMethod(classPackagePath, methodName) ;
		}
	}

}




















